﻿using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using EFDebugging;

namespace SQDebugging
{
    /// <summary>
    /// Nutzen des Windows internen Eventlogs um Nachrichten und Fehlermeldungen auszugeben
    /// </summary>
    public class Eventlogging
    {
        //QUELLE: http://msdn.microsoft.com/de-de/library/bb979181.aspx
        #region Member
        private static string _myAppName = "SquadWuschelsApp";
        #endregion

        #region Properties
        /// <summary>
        /// Setzt für die ganze Anwendug den Applicationname für das Eventlogging
        /// </summary>
        public static string MyAppName
        {
            get { return _myAppName; }
            set { _myAppName = value; }
        }
        #endregion

        #region Functions/Subs
        /// <summary>
        /// Schreibt die übergebene Exception in das Eventlog. Als Error und dem Typ Application und dem unter MyAppName angegebenen Namen
        /// </summary>
        /// <param name="exception">exception die ins Eventlog geschrieben werden soll</param>
        public static void WriteErrorLog(Exception exception)
        {
            WriteErrorLog(Debugging.GetStackTrace(exception),EventLogEntryType.Error,EventLogType.Application,MyAppName);
        }

        /// <summary>
        /// Schreibt den übergebenen String ins Eventlog. Als AppName wird der Bezeichner aus MyAppName genommen und angelegt und dem Typ Application.
        /// </summary>
        /// <param name="message">Die Nachricht die im Eventlog abgelegt werden soll</param>
        /// <param name="eventLogEntryType">Typ der Benachrichtigung z.B. Error, Information, ....</param>
        public static void WriteErrorLog(string message, EventLogEntryType eventLogEntryType)
        {
            WriteErrorLog(message, eventLogEntryType, EventLogType.Application, MyAppName);
        }

        /// <summary>
        /// Schreiben die übergebene Meldung in das Windows Eventlog
        /// </summary>
        /// <param name="eventLogMessage">Nachricht die in das Eventlog geschrieben werden soll</param>
        /// <param name="eventLogEntryType">Nachrichtentyp mit der die Message makiert werden soll</param>
        /// <param name="eventLogType">Angabe in welchem Eventlog die Nachricht erscheinen soll</param>
        /// <param name="applicationName">Name der aktuellen Anwendung die im Eventlog als "Absender" angegeben werden soll</param>
        public static void WriteErrorLog(string eventLogMessage, EventLogEntryType eventLogEntryType, EventLogType eventLogType, string applicationName)
        {
            try
            {
                //Neues Eventlog erstellen
                EventLog eventLog = new EventLog();

                //Prüfen ob der übergebenen Applicationname schon im Eventlog existiert
                if (!EventLog.SourceExists(applicationName))
                {
                    //Wenn der Applicationname noch nicht existiert, diesen anlegen
                    EventLog.CreateEventSource(applicationName, eventLogType.ToString());
                }

                //Den Applicationnamen festlegen in unserem aktuellen EventLog
                eventLog.Source = applicationName;

                //Schreiben der Meldung in das Eventlog die übergeben wurde.
                eventLog.WriteEntry(eventLogMessage, eventLogEntryType);
            }
            catch (Exception exception)
            {
                //Wenn nicht ins Eventlog geschrieben werden konnte, versuchen in das Logfile zu schreiben
                Debugging.WriteLog(exception);
            }
        }

        /// <summary>
        /// Durchsucht das Eventlog nach dem übergebenen ApplicationName und gibt hier alle Einträge zurück
        /// </summary>
        /// <param name="applicationName">Name der Anwendung nach der im Eventlog gesucht werden soll</param>
        /// <param name="eventLogType">EventlogType der durchsucht werden soll.</param>
        /// <returns>String aus allen Eventlogeinträgen</returns>
        public static string GetErrorLog(string applicationName, EventLogType eventLogType)
        {
            StringBuilder stringBuilder = new StringBuilder();
            EventLog eventLog = new EventLog();
            //Nicht sicher ob das ausgewertet wird
            eventLog.Log = eventLogType.ToString();

            //Alle Einträge des Eventlogs durchgehen
            foreach (EventLogEntry entry in eventLog.Entries)
            {
                if (entry.Source == applicationName)
                {
                    stringBuilder.AppendFormat("Time: {0} Message -> {1}", entry.TimeWritten, entry.Message);
                    stringBuilder.Append("\n");
                    stringBuilder.Append(new string('=',40));
                    stringBuilder.Append("\n");
                    stringBuilder.Append("\n");
                }
            }

            eventLog.Close();
            return stringBuilder.ToString();
        }
        #endregion
    }
}
